﻿using Credinka.Ayni.SEA.EN;
using Credinka.Ayni.SEA.RN;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using Credinka.Ayni.GEN.UTL;

public partial class MasterPage : System.Web.UI.MasterPage
{
    private enMenu oenMenu;
    private rnMenu ornMenu;
    private List<enMenu> loenMenu;
    private enUsuario oenUsuario = new enUsuario();
    private rnOficina ornOficina;
    private enDescripcion oenDescripcion;
    private rnDescripcion ornDescripcion;
    private List<enDescripcion> loenDescripcion;

    private rnLogueo ornLogueo;
    private enLogueo oenLogueo;
    public string sUrl
    {
        get { return (Page.ResolveUrl("~")); }
    }

    #region Métodos

    // Se cargan los datos del usuario - Barra Inferior
    private void CargarDatosUsuario()
    {
        ornOficina = new rnOficina();
        lblFecha.Text = DateTime.Now.ToShortDateString();
        lblHora.Text = DateTime.Now.ToLongTimeString();
        lblNombreCompletoUsuario.Text = oenUsuario.NombreCompleto;
        lblNombreOficina.Text = Session["NombreOficina"] != null ? Session["NombreOficina"].ToString() : Session["nombreOficinaPorDefecto"].ToString();
        lblCargo.Text = oenUsuario.entDescripcion.Descripcion.ToString();
    }

    private void RegistrarAcceso()
    {
        string cadena = "";
        oenLogueo = new enLogueo();
        ornLogueo = new rnLogueo();
        oenLogueo.IdUsuario = oenUsuario.IdUsuario;
        oenLogueo.NombreUsuario = oenUsuario.NombreUsuario;
        oenLogueo.IdCargo = oenUsuario.IdCargo;
        for (int i = 0; i < oenUsuario.entPerfil.Count; i++)
        {
            int contador = 0;
            cadena = cadena + oenUsuario.entPerfil[i].Nombre + ": " + oenUsuario.entPerfil[i].IdPerfil + ", ";
            contador = contador + 1;
        }
        oenLogueo.Perfil = cadena;
        oenLogueo.CodigoOficina = Session["CodigoOficina"] != null ? Session["CodigoOficina"].ToString() : Session["codigoOficinaPorDefecto"].ToString();
        oenLogueo.FechaInicio = DateTime.Now;
        oenLogueo.AudIPAcceso = utlAuditoria.ObtenerDireccionIP();
        oenLogueo.AudMacAcceso = utlAuditoria.ObtenerDireccionMAC();
        ornLogueo.Registrar(oenLogueo);
    }

    // Listo Sistema como primer nivel.
    private List<enDescripcion> OpcionesSistema()
    {
        int idPerfil;
        List<enDescripcion> listaTemporalPadre = new List<enDescripcion>();
        ornDescripcion = new rnDescripcion();

        for (int i = 0; i < oenUsuario.entPerfil.Count; i++)
        {
            idPerfil = Convert.ToInt32(oenUsuario.entPerfil[i].IdPerfil);
            loenDescripcion = ornDescripcion.ListarSistemaPorPerfil(idPerfil);

            foreach (var item in loenDescripcion)
            {
                oenDescripcion = new enDescripcion();
                oenDescripcion.CodigoElemento = item.CodigoElemento;
                oenDescripcion.Descripcion = item.Descripcion;
                listaTemporalPadre.Add(oenDescripcion);
            }
        }
        return EliminarElementosDuplicadosPadres(listaTemporalPadre);
    }

    // Opciones a partir del 2do nivel, contenedor : 0.
    private List<enMenu> Opciones()
    {
        int idPerfil;
        List<enMenu> listaTotalMenu = new List<enMenu>();
        ornMenu = new rnMenu();
        ornDescripcion = new rnDescripcion();

        for (int i = 0; i < oenUsuario.entPerfil.Count; i++)
        {
            idPerfil = Convert.ToInt32(oenUsuario.entPerfil[i].IdPerfil);
            loenMenu = ornMenu.ListarPorPerfil(idPerfil).ToList();

            foreach (var item in loenMenu)
            {
                oenMenu = new enMenu();
                oenMenu.IdMenu = item.IdMenu;
                oenMenu.Contenedor = item.Contenedor;
                oenMenu.Nombre = item.Nombre;
                oenMenu.CodigoSistema = item.CodigoSistema;
                oenMenu.IdFormulario = item.IdFormulario;
                oenMenu.entFormulario = new enFormulario();
                oenMenu.entFormulario.Decripcion = item.entFormulario.Decripcion;
                listaTotalMenu.Add(oenMenu);
            }
        }
        return EliminarElementosDuplicadosHijos(listaTotalMenu);
    }

    // Ya que se establece un merge de opciones debido a la cantidad de perfiles que un usuario puede tener asociado. Elimino los duuplicados de sistemas.
    private List<enDescripcion> EliminarElementosDuplicadosPadres(List<enDescripcion> inputList)
    {
        Dictionary<int?, string> uniqueStore = new Dictionary<int?, string>();
        List<enDescripcion> finalList = new List<enDescripcion>();
        foreach (enDescripcion gra in inputList)
        {
            if (!uniqueStore.ContainsKey(gra.CodigoElemento))
            {
                uniqueStore.Add(gra.CodigoElemento, gra.Descripcion);
                finalList.Add(gra);
            }
        }
        return finalList;
    }

    // Ya que se establece un merge de opciones debido a la cantidad de perfiles que un usuario puede tener asociado. Elimino los duuplicados.
    private List<enMenu> EliminarElementosDuplicadosHijos(List<enMenu> inputList)
    {
        Dictionary<int?, int?> uniqueStore = new Dictionary<int?, int?>();
        List<enMenu> finalList = new List<enMenu>();
        foreach (enMenu gra in inputList)
        {
            if (!uniqueStore.ContainsKey(gra.IdMenu))
            {
                uniqueStore.Add(gra.IdMenu, gra.Contenedor);
                finalList.Add(gra);
            }
        }
        return finalList;
    }

    private void Sistema()
    {
        List<enMenu> listaParaMenu = new List<enMenu>();
        ornDescripcion = new rnDescripcion();
        loenDescripcion = OpcionesSistema();

        foreach (var item in loenDescripcion)
        {
            oenMenu = new enMenu();
            oenMenu.entDescripcion = new enDescripcion();
            oenMenu.entDescripcion.CodigoElemento = item.CodigoElemento;
            oenMenu.entDescripcion.Descripcion = item.Descripcion;
            listaParaMenu.Add(oenMenu);
        }

        for (int y = 0; y < listaParaMenu.Count; y++)
        {
            MenuItem menuItem = new MenuItem(listaParaMenu[y].entDescripcion.Descripcion, listaParaMenu[y].entDescripcion.CodigoElemento.ToString(), "", "");
            menu.Items.Add(menuItem);
            ListarMenu(menu.Items[y].ChildItems, 0, listaParaMenu[y].entDescripcion.CodigoElemento);
        }
    }

    // Resultado del menu en treeview.
    protected void ListarMenu(MenuItemCollection item, int padre, int sistema)
    {
        int Codigo;
        string Nombre;
        string Ruta;
        oenMenu = new enMenu();
        ornMenu = new rnMenu();
        oenMenu.entFormulario = new enFormulario();

        List<enMenu> listaParaMenu = Opciones().ToList().Where(t => t.Contenedor == padre && t.CodigoSistema == sistema).ToList();

        foreach (var hijos in listaParaMenu)
        {
            Codigo = hijos.IdMenu;
            Nombre = hijos.Nombre;
            Ruta = hijos.entFormulario.Decripcion;
            MenuItem menuItem = new MenuItem(Nombre, Codigo.ToString(), "", Ruta);
            menuItem.NavigateUrl = Ruta;
            item.Add(menuItem);
            ListarMenu(menuItem.ChildItems, Codigo, sistema);
        }
    }

    #endregion

    #region Eventos

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            if (Session["obe_Usuario"] != null)
            {
                RegistrarAcceso();
                Sistema();
                CargarDatosUsuario();
            }
            else
                Response.Redirect("~/Login.aspx");
        }
    }

    protected void Page_Init(object sender, EventArgs e)
    {
        if (Request.Cookies[FormsAuthentication.FormsCookieName] != null)
        {
            FormsAuthenticationTicket tkt;
            String cookiestr;
            cookiestr = Request.Cookies[FormsAuthentication.FormsCookieName].Value;
            tkt = FormsAuthentication.Decrypt(cookiestr);
            Session.Add("nombreOficinaPorDefecto", tkt.UserData);
            Session.Add("codigooficinaPorDefecto", tkt.Name);
            oenUsuario = (enUsuario)Session["obe_Usuario"];
            if (oenUsuario == null)
            {
                Response.Redirect("~/Login.aspx", true);
                return;
            }
        }
    }

    protected void menus_MenuItemClick(object sender, MenuEventArgs e)
    {
        var url = e.Item.NavigateUrl;
    }

    protected void btnSalir_Click(object sender, ImageClickEventArgs e)
    {
        Session.Clear();
        Session.Abandon();

        if (Session["obe_Usuario"] == null)
        {
            FormsAuthentication.SignOut();
            Response.Redirect("~/Login.aspx", true);
        }
    }

    #endregion
}
